struct student *creat()
{ 
	int n,i;
	FILE *fp;
	struct student *p,*q,*head;
	printf("请输入总人数：");
	scanf("%d",&n);
	if(n<=0)
	{
		printf("人数不对！\n");
		return ;
	}
	p=q=(struct student *)malloc(sizeof(struct student));
	printf("请输入姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育\n");
	scanf("%s %s %s %f %f %f %f %f %f\n",p->name,p->number,p->zhuanye,&p->yuwen,&p->shuxue,
								&p->yingyu,&p->lishi,&p->chengxu,&p->tiyu);
	head=p;
	for(i=1;i<n;i++)
	{
		q=(struct student *)malloc(sizeof(struct student));
		scanf("%s %s %s %f %f %f %f %f %f\n",q->name,q->number,q->zhuanye,&q->yuwen,&q->shuxue,
								&q->yingyu,&q->lishi,&q->chengxu,&q->tiyu);
		p->next=q;
		p=q;	
	}
	p->next=NULL;
	printf("\n学生基本信息已录入\n");
	return head;
}

//2-增加学生信息 
void zengjia(struct student *head)
{
	char name[20]; 
	char num[20];
	struct student *p,*q;
	int i=1;
	p=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	while(p!=NULL) {
			p=p->next;
		}
	while(i!=0) {
		q=(struct student *)malloc(sizeof(struct student));
		printf("\n请输入要添加学生的姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育\n");
		scanf("%s %s %s %f %f %f %f %f %f \n",q->name,q->number,q->zhuanye,&q->yuwen,&q->shuxue,
								&q->yingyu,&q->lishi,&q->chengxu,&q->tiyu);
		p->next=q;
		p=q;
		printf("已新增学生信息\n");
		printf("\n0.不再录入\t1.继续录入\n");
		scanf("%d", &i);
	}
	printf("增加完毕\n");
} 

//3-删除学生信息
void shanchu(struct student *head) 
{
	char name[20];
	struct student *p,*q;
	int i=1;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	printf("请输如你想要删除的姓名\n");
	scanf("%s",name);
	while(i!=0)
	{
  	 	p=head;
    	while(strcmp(p->name,name)!=0&&p->next!=NULL)
    	{
     		q=p;
			p=p->next;
    	}  //直到找到为止
    	if(strcmp(p->name,name)==0)  //姓名匹配
    	{
			if(p==head)    //如果这个学生是第一个学生的话
    	    {
				printf("你删除的学生信息为:\n");
				printf("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育\t总分\t排名\n");
        	    printf("%s %s %s %f %f %f %f %f %f\n",q->name,q->number,q->zhuanye,q->yuwen,q->shuxue,
									q->yingyu,q->lishi,q->chengxu,q->tiyu);
				printf("学生%s删除成功\n",name);
				head=p->next;
			}//  头head要换 不然就会出错
        	else
        	{
        	    printf("你删除的学生信息为:\n");
				printf("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育\t总分\t排名\n");
        	    printf("%s %s %s %f %f %f %f %f %f\n",q->name,q->number,q->yuwen,q->shuxue,
									q->yingyu,q->lishi,q->chengxu,q->tiyu);
				printf("学生%s删除成功\n",name);
				q->next=p->next;
       		 }
		}
		if(strcmp(p->name,name)!=0)
		{
			printf("没有%s这号人！！！\n",name);
		}
		printf("\n输入1：继续删除     0：退出\n");
		scanf("%d",&i);
		}	
	printf("删除完毕\n");
} 


//4-修改学生基本信息
void xiugai(struct student *head)
{
	struct student *p,*q;
	int i=1;
	char name[20];
    p=head;
    if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	printf("请输入你想修改的姓名\n");
	scanf("%s",name);
	while(strcmp(name,p->name)!=0&&p->next!=NULL)
    {
        q=p;
		p=p->next;
    }  //直到找到为止
    if(strcmp(name,p->name)==0)
    {
		printf("你要修改的学生信息为:\n");
		printf("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育\n");
        printf("%s %s %s %f %f %f %f %f %f \n",q->name,q->number,q->zhuanye,q->yuwen,q->shuxue,
								q->yingyu,q->lishi,q->chengxu,q->tiyu);
		printf("1:修改学生姓名\n");
		printf("2:修改学生学号\n");
		printf("3:修改学生专业\n");
		printf("4:修改学生语文\n");
		printf("5:修改学生数学\n");
		printf("6:修改学生英语\n");
		printf("7:修改学生历史\n");
		printf("8:修改学生程序\n");
		printf("9:修改学生体育\n");
		while(i) 
		{
			switch(i)
			{
				case 1:
					printf("请修改学生的姓名:\n");
					scanf("%f",&p->name);
				case 2:
					printf("请修改学生的学号:\n");
					scanf("%f",&p->number);
				case 3:
					printf("请修改学生的专业:\n");
					scanf("%f",&p->zhuanye);
				case 4:
					printf("请修改语文的成绩:\n");
					scanf("%f",&p->yuwen);
				case 5:
					printf("请修改数学的成绩:\n");
					scanf("%f",&p->shuxue);
				case 6:
					printf("请修改英语的成绩:\n");	
					scanf("%f",&p->yingyu);	
				case 7:
					printf("请修改历史的成绩:\n");
					scanf("%f",&p->lishi);
				case 8:
					printf("请修改程序的成绩:\n");
					scanf("%f",&p->chengxu);
				case 9:
					printf("请修改体育的成绩:\n");
					scanf("%f",&p->tiyu);	
			} 
			printf("\n输入1：继续删除     0：退出\n");
			scanf("%d",&i);
		}
		printf("成绩已经更新完毕\n");
		printf("更新后的学生信息为:\n");
		printf("姓名\t学号\t专业\t语文\t数学\t英语\t历史\t程序\t体育\n");
        printf("%s %s %s %f %f %f %f %f %f \n",q->name,q->number,q->zhuanye,q->yuwen,q->shuxue,
								q->yingyu,q->lishi,q->chengxu,q->tiyu);
    }else
	{
		printf("没有%s这号人！！！\n",name);
	}
	printf("修改完毕\n");
} 

//5-班级内单科成绩排名
void banjichengji(struct student *head)
{
	struct student *p;
	int a,b=1;
	p=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	while(b!=0)
	{
		printf("\n 1：查询班级内语文成绩\n");
		printf("\n 2：查询班级内数学成绩\n");
		printf("\n 3：查询班级内英语成绩\n");
		printf("\n 4：查询班级内历史成绩\n");
		printf("\n 5：查询班级内程序成绩\n");
		printf("\n 6：查询班级内体育成绩\n");
		printf("请按照描述进行你想做的事\n");
		scanf("%d",&a);
		switch(a)
		{
			case 1:
					yuwen(head);
					break;
			case 2:
					shuxue(head);
					break;
			case 3:
					yingyu(head);
					break;
			case 4:
					lishi(head);
					break;
			case 5:
					chengxu(head);
					break;
			case 6:
					tiyu(head);
					break;
			default :
					printf("\nErrpr!\n");
					break;
		}
		printf("如果你想继续查询单科成绩排名的话请输入  1。\n");
		printf("如果你想退出的话请输入  0。\n");
		scanf("%d",&b);
	}
}


//5-1-语文单科成绩 
void yuwen(struct student *head)
{
	struct student *p,*q;
	int i,j,n=0;
	float t;
	p=q=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	while(p!=NULL)
	{
		p=p->next;
		n++;
	}
	for(i=0;i<n;i++)
	{
		p=head;
		q=p->next;
		for(j=0;j<n-i-1;j++)
		{
			if(p->yuwen<q->yuwen)
			{
				t=p->yuwen;
				p->yuwen=q->yuwen;
				q->yuwen=t;
			}
			p=p->next;
			q=q->next;
		}
	}	
	
	printf("语文成绩单成绩如下\n");
	printf("姓名 学号 成绩\n"); 
	p=head;
	while(p!=NULL) //输出语文成绩单 
	{
    	printf("%s %s %f\n",p->name,p->number,p->yuwen);
		p=p->next;
	}
}


//3-2-数学单科成绩 
void shuxue(struct student *head)
{
	struct student *p,*q;
	int i,j,n=0;
	float t;
	p=q=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	while(p!=NULL)
	{
		p=p->next;
		n++;
	}
	
	for(i=0;i<n;i++)
	{
		p=head;
		q=p->next;
		for(j=0;j<n-i-1;j++)
		{
			if(p->shuxue<q->shuxue)
			{
				t=p->shuxue;
				p->shuxue=q->shuxue;
				q->shuxue=t;
			}
			p=p->next;
			q=q->next;
		}
	}	
	
	printf("数学成绩单成绩如下\n");
	printf("姓名 学号 成绩\n"); 
	
	p=head;
	
	while(p!=NULL) //输出数学成绩单 
	{
    	printf("%s %s %f\n",p->name,p->number,p->shuxue);
		p=p->next;
	}
}


//3-3-英语单科成绩 
void yingyu(struct student *head)
{
	struct student *p,*q;
	int i,j,n=0;
	float t;
	p=q=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	while(p!=NULL)
	{
		p=p->next;
		n++;
	}
	
	for(i=0;i<n;i++)
	{
		p=head;
		q=p->next;
		for(j=0;j<n-i-1;j++)
		{
			if(p->yingyu<q->yingyu)
			{
				t=p->yingyu;
				p->yingyu=q->yingyu;
				q->yingyu=t;
			}
			p=p->next;
			q=q->next;
		}
	}	
	
	printf("英语成绩单成绩如下\n");
	printf("姓名 学号 成绩\n"); 
	p=head;
	while(p!=NULL) //输出英语成绩单 
	{
    	printf("%s %s %f\n",p->name,p->number,p->yingyu);
		p=p->next;
	}
}


//3-4-历史单科成绩 
void lishi(struct student *head)
{
	struct student *p,*q;
	int i,j,n=0;
	float t;
	p=q=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	while(p!=NULL)
	{
		p=p->next;
		n++;
	}
	
	for(i=0;i<n;i++)
	{
		p=head;
		q=p->next;
		for(j=0;j<n-i-1;j++)
		{
			if(p->lishi<q->lishi)
			{
				t=p->lishi;
				p->lishi=q->lishi;
				q->lishi=t;
			}
			p=p->next;
			q=q->next;
		}
	}	
	
	printf("历史成绩单成绩如下\n");
	printf("姓名 学号 成绩\n"); 
	
	p=head;
	
	while(p!=NULL) //输出历史成绩单 
	{
    	printf("%s %s %f\n",p->name,p->number,p->lishi);
		p=p->next;
	}
}


//3-5-程序单科成绩 
void chengxu(struct student *head)
{
	struct student *p,*q;
	int i,j,n=0;
	float t;
	p=q=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	while(p!=NULL)
	{
		p=p->next;
		n++;
	}
	
	for(i=0;i<n;i++)
	{
		p=head;
		q=p->next;
		for(j=0;j<n-i-1;j++)
		{
			if(p->chengxu<q->chengxu)
			{
				t=p->chengxu;
				p->chengxu=q->chengxu;
				q->chengxu=t;
			}
			p=p->next;
			q=q->next;
		}
	}	
	
	printf("程序成绩单成绩如下\n");
	printf("姓名 学号 成绩\n"); 
	
	p=head;
	
	while(p!=NULL) //输出程序成绩单 
	{
    	printf("%s %s %f\n",p->name,p->number,p->chengxu);
		p=p->next;
	}
}


//3-6-体育单科成绩 
void tiyu(struct student *head)
{
	struct student *p,*q;
	int i,j,n=0;
	float t;
	p=q=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	while(p!=NULL)
	{
		p=p->next;
		n++;
	}
	
	for(i=0;i<n;i++)
	{
		p=head;
		q=p->next;
		for(j=0;j<n-i-1;j++)
		{
			if(p->tiyu<q->tiyu)
			{
				t=p->tiyu;
				p->tiyu=q->tiyu;
				q->tiyu=t;
			}
			p=p->next;
			q=q->next;
		}
	}	
	
	printf("体育成绩单成绩如下\n");
	printf("姓名 学号 成绩\n"); 
	
	p=head;
	
	while(p!=NULL) //输出体育成绩单 
	{
    	printf("%s %s %f\n",p->name,p->number,p->tiyu);
		p=p->next;
	}
}



//6-查询学生信息 
void xueshengchengji(struct student *head)
{
	struct student *p,*q;
	char name[20];
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	printf("请输入要查询的学生的姓名：");
	scanf("%s",name);
	p=head;
	q=p->next;
	if(strcmp(name,p->name)==0)
	{
		printf("查询的信息为:\n");
		printf("姓名\t学号\t  语文\t数学\t英语\t历史\t程序\t体育\n");
		printf("%s %s %f %f %f %f %f %f\n",q->name,q->number,q->yuwen,q->shuxue,q->yingyu,q->lishi,q->chengxu,q->tiyu);
	}else
	{
		while(q&&(strcmp(q->name,name)!=0))
		{
			q=q->next;
		}
		if(q)//找到了 
		{
			printf("查询的信息为:\n");
			printf("姓名\t学号\t语文\t数学\t英语\t历史\t程序\t体育\t总分\t排名\n");
			printf("%s %s %f %f %f %f %f %f\n",q->name,q->number,q->yuwen,q->shuxue,q->yingyu,q->lishi,q->chengxu,q->tiyu);
		}else
		{
			printf("没有%s这一号人！！！\n",name);
		}
	}
}


//7-统计所有不及格科目超过两科的学生名单
void bujige(struct student *head)
{
	FILE *fp;
	struct student *p;
	int sum=0;
	p=head;
	if(p==NULL)
    {
    	printf("错误！\n");
    	return ;
	}
	
	if((fp= fopen("学生基本信息.txt", "r")) == NULL) {
		printf("file can not open\n");
		exit(1);
	}
	
	printf("\n以下为不及格目超过两科的学生名单\n");
	printf("姓名\t学号\t语文\t数学\t英语\t历史\t程序\t体育\n");
	while(p!=NULL)
	{
		if(p->yuwen<60)
		{
			sum++;
		}
		if(p->shuxue<60)
		{
			sum++;
		}
		if(p->yingyu<60)
		{
			sum++;
		}
		if(p->chengxu<60)
		{
			sum++;
		}
		if(p->lishi<60)
		{
			sum++;
		}
		if(p->tiyu<60)
		{
			sum++;
		}
		if(sum>=2)
		{
			fprintf(fp,"%s %s %s %f %f %f %f %f %f\n",p->name,p->number,p->zhuanye,p->yuwen,p->shuxue,
								p->yingyu,p->lishi,p->chengxu,p->tiyu);
		}
		sum=0;
		p=p->next;
	}
	printf("不及格科目超过两科的学生名单如上\n");
	fclose(fp);
}

 

//0-主函数 
int main()
{
	struct student *creat();
	struct student *head;
	int choice;
	printf("欢迎使用我的学生成绩管理系统！\n");
	printf("\n输入1可录入学生基本信息\n");
	printf("\n输入2可增加学生的信息\n");
	printf("\n输入3可删除学生基本成绩\n");
	printf("\n输入4可修改学生基本成绩\n");
	printf("\n输入5可查询班级内单科成绩\n");
	printf("\n输入6可查询某学生单科成绩\n");
	printf("\n输入7可查看所有不及格科目超过两科的学生名单\n");
	printf("\n输入8可直接退出\n"); 
	scanf("%d",&choice);
	while(choice!=0)
	{
		switch (choice)
		{
			case 1:														//1-录入学生基本信息 
				head=creat();
				break;
			case 2:														//2-增加学生的信息
				zengjia(head);
				break;
			case 3:														//3-删除学生基本成绩 
				shanchu(head);
				break;
			case 4:														//4-修改学生基本成绩			
				xiugai(head);
				break;
			case 5:														//5-查询班级内单科成绩
				banjichengji(head);
				break;
			case 6:														//6-查询某学生单科成绩
				xueshengchengji(head);
				break;
			case 7:														//7-查看所有不及格科目超过两科的学生名单 
				bujige(head);
				break;
			case 8:														//8-退出 
				printf("\n欢迎下次使用\n"); 
				break; 
			default :
				printf("错误！\n");
				break;
		}
		printf("\n输入1可录入学生单科成绩\n");
		printf("\n输入2可增加学生的信息\n");
		printf("\n输入3可删除学生基本成绩\n");
		printf("\n输入4可修改学生基本成绩\n");
		printf("\n输入5可查询班级内单科成绩\n");
		printf("\n输入6可查询某学生单科成绩\n");
		printf("\n输入7可查询所有不及格科目超过两科的学生名单\n");
		printf("\n输入8可直接退出\n"); 
		scanf("%d",&choice);
	}
	printf("谢谢~\n");
	return 0;
}

